home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / compiler / Emit_phr.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  1.3 KB  |  56 lines  |  [TEXT/R*ch]

  1. (* Emitting phrases *)
  2.  
  3. local
  4.   open BasicIO Nonstdio Mixture Const Instruct Buffcode;
  5.   open Code_dec Reloc Emitcode;
  6. in
  7.  
  8. val abs_out_position = ref 0;
  9.  
  10. val compiled_phrase_index = ref ([] : compiled_phrase list);
  11.  
  12. fun start_emit_phrase os =
  13. (
  14.   output_binary_int os 0;
  15.   abs_out_position := 4;
  16.   compiled_phrase_index := []
  17. );
  18.  
  19. fun emit_phrase os (phr : ZamPhrase) =
  20. (
  21.   reloc_reset();
  22.   init_out_code();
  23.   Labels.reset_label_table();
  24.   if #kph_funcs phr = [] then
  25.     emit (#kph_inits phr)
  26.   else
  27.     (emit (#kph_inits phr);
  28.      emit [Kbranch 0];
  29.      emit (#kph_funcs phr);
  30.      emit [Klabel 0]);
  31.   buff_output os (!out_buffer) 0 (!out_position);
  32.   compiled_phrase_index :=
  33.     { cph_pos   = !abs_out_position,
  34.       cph_len   = !out_position,
  35.       cph_reloc = get_reloc_info(),
  36.       cph_pure  = #kph_is_pure phr}
  37.         :: !compiled_phrase_index;
  38.   abs_out_position := !abs_out_position + !out_position
  39. );
  40.  
  41. fun end_emit_phrase
  42.   excRenList valRenList sigStamp mentions os =
  43. (
  44.   output_value os
  45.     { cu_phrase_index = !compiled_phrase_index,
  46.       cu_exc_ren_list = excRenList,
  47.       cu_val_ren_list = valRenList,
  48.       cu_sig_stamp = sigStamp,
  49.       cu_mentions = mentions };
  50.   compiled_phrase_index := [];
  51.   seek_out os 0;
  52.   output_binary_int os (!abs_out_position)
  53. );
  54.  
  55. end;
  56.